/*
 * Copyright 2020-2025 the original author or authors.
 * You cannot use this file unless authorized by the author.
 */

package org.ipig.constants;

import org.apache.commons.lang.StringUtils;

/**
 * 数据库常用操作
 *
 * @author <a href="mailto:comchnts@163.com">chinats</a>
 * @version $$Id: DbmsOperators.java 3 2020-01-21 09:36:33Z ts <comchnts@163.com> $$
 * @since 1.0
 */
public class DbmsOperators {
    /**
     * 排序类型
     */
    public enum SortType {
        /**
         * 升序
         */
        ASC("asc", 1, "升序"),
        /**
         * 降序
         */
        DESC("desc", -1, "降序");
        //code
        public final String code;
        //num
        public final int num;
        //title
        public final String title;

        /**
         * @param code  String
         * @param title String
         */
        SortType(String code, int num, String title) {
            this.code = code;
            this.num = num;
            this.title = title;
        }

        /**
         * 解析编码
         *
         * @param code 编码
         * @return SortType
         */
        public static SortType parse(String code) {
            for (SortType type : SortType.values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return SortType.DESC;
        }
    }

    /**
     * 连接类型
     */
    public enum JoinType {
        /**
         * 内连接
         */
        INNER("inner", "inner join", "内连接"),
        /**
         * 左连接
         */
        LEFT("left", "left join", "左连接"),
        /**
         * 右连接
         */
        RIGHT("right", "right join", "右连接"),
        /**
         * 全连接
         */
        FULL("full", "full join", "全连接");
        //code
        public final String code;
        //sql
        public final String sql;
        //title
        public final String title;

        /**
         * @param code  String
         * @param title String
         */
        JoinType(String code, String sql, String title) {
            this.code = code;
            this.sql = sql;
            this.title = title;
        }

        /**
         * 解析编码
         *
         * @param code 编码
         * @return OpType
         */
        public static JoinType parse(String code) {
            for (JoinType type : JoinType.values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return null;
        }
    }

    /**
     * 对数据库的常用操作
     */
    public enum OpType {
        /**
         * 插入操作
         */
        INSERT("I", "插入操作"),
        /**
         * 删除操作
         */
        DELETE("D", "删除操作"),
        /**
         * 更新操作
         */
        UPDATE("U", "更新操作");
        //code
        public final String code;
        //title
        public final String title;

        /**
         * @param code  String
         * @param title String
         */
        OpType(String code, String title) {
            this.code = code;
            this.title = title;
        }

        /**
         * 解析编码
         *
         * @param code 编码
         * @return OpType
         */
        public static OpType parse(String code) {
            for (OpType opType : OpType.values()) {
                if (opType.code.equals(code)) {
                    return opType;
                }
            }
            return null;
        }
    }


    /**
     * 更新增量模式
     */
    public enum UpdateIncModel {
        /**
         * 取更新后的值
         */
        CHANGE_AFGER("A", "取更新操作后的值"),
        /**
         * 取更新操作前与操作后的差异值
         */
        CHANGE_DIFFERENCE("D", "取更新操作前与操作后的差异值");
        //code
        public final String code;
        //title
        public final String title;

        /**
         * @param code  String
         * @param title String
         */
        UpdateIncModel(String code, String title) {
            this.code = code;
            this.title = title;
        }

        /**
         * 解析
         *
         * @param code
         * @return
         */
        public static UpdateIncModel parse(String code) {
            for (UpdateIncModel model : UpdateIncModel.values()) {
                if (StringUtils.equalsIgnoreCase(model.code, code)) {
                    return model;
                }
            }
            return null;
        }
    }

    /**
     * 更新操作
     */
    public enum UpdateType {
        /**
         * 更新操作前
         */
        UPDATE_BEFORE("U_B", "更新操作前"),
        /**
         * 更新操作后
         */
        UPDATE_AFGER("U_A", "更新操作后");
        /**
         * code
         */
        public final String code;
        /**
         * title
         */
        public final String title;

        /**
         * @param code  String
         * @param title String
         */
        UpdateType(String code, String title) {
            this.code = code;
            this.title = title;
        }
    }
}
